<?php 
	header("Content-Type:text/html;charset=utf8");
	echo '<pre>';



	// 1 匹配日期
	$date = '2014/05/23';
	//$date = '2014-05/23';
	//$date = '2014.05/23';
	//正则分割字符串 /[-\.\/]+/   匹配 /.-    一次或多次
	list($year,$month,$day) = preg_split("/[-\.\/]+/",$date);
//	方法已弃用
//	list($year,$month,$day) = split("[/-.]",$date);
	echo "Month: $month; Day: $day; Year: $year <br/>";
	//结果 Month: 05; Day: 23; Year: 2014 

	// 2 根据购物车中商品的Item ID 准确判断客人的原装机型号
	$title = 'Replacement canon BP-511 Camcorder Canon Battery [Item ID:3-236-523]';
	//PREG_OFFSET_CAPTURE 返回 匹配成功字串所在位置
	if(preg_match("/(\[Item ID\:)(\d+)-(\d+)-(\d+)(])/",$title,$arr)){
		echo '<pre>';
		//array_shift($arr);
		//array_shift($arr);
		//array_pop($arr);
		print_r($arr);
		echo '</pre>';
	}
	/**
	 * 结果
	 * Array
	 *	(
	 *	    [0] => [Item ID:3-236-523]
	 *	    [1] => [Item ID:
	 *	    [2] => 3
	 *	    [3] => 236
	 *	    [4] => 523
	 * 	    [5] => ]
	 * 	)	
	 */

	
	// 3 搜索单词 Canon
	// 3.1 /g 表示该表达式将用来在输入字符串中查找所有可能的匹配，返回的结果可以是多个。
	//        如果不加/g最多只会匹配一个
	// 3.2 /i 表示匹配的时候不区分大小写
	// 3.3 /m 表示多行匹配，什么是多行匹配呢？就是匹配换行符两端的潜在匹配。影响正则的^$符号

	if(preg_match("/\bCanon\b/m",$title,$str)){
		print_r($str);
		echo 'was found';
		echo '<br/>';
	}else{
		echo 'was not found';
	}

	/**
	 * 结果
	 * Array
	 * {
	 *		[0] => Canon 
	 * }
 	 * was found 
 	 *
 	 */


	// 4 功能: 转义正则表达式字符，此函数很有用，可以供你写正则表达式时参考 
	$keywords = '$40 for a g3/400' ;
	// $keywords = '[Item ID:3-236-523]';
	$keywords = preg_quote($keywords,"/");
	echo $keywords;
	echo '<br/>';
	// 结果  \$40 for a g3\/400


	// 5 preg_quote($word) 用来使星号不在正则表达式中
	//   具有特殊意义
	$textbody = "This book is *very* difficult to find.";
	$word = "*very*";

	$textbody = preg_replace("/".preg_quote($word)."/","<b>" .$word . "</b>",$textbody);

	echo $textbody;
	echo '<br/>';
	// 结果 This book is *very* difficult to find.


	// 6 网址
	$regex = '/^http:\/\/([\w.]+)\/([\w.]+)\/([\w.]+)\.html$/i';
	$str = 'http://youku.com/show_page/id_ACBCKLJ.html';
	if(preg_match($regex, $str,$matchs)){
		// 0 全部网址
		// 1 域名
		// ...  参数
		print_r($matchs);
	}
	/**
	 * 结果 
	 * Array
	 *(
	 *   [0] => http://youku.com/show_page/id_ACBCKLJ.html
     *	 [1] => youku.com
     *	 [2] => show_page
	 *	 [3] => id_ACBCKLJ
	 *)
	 */


	// 7 通配符(lookarounds): 断言某些字符串中某些字符是否存在
	//   lookarounds分两种，lookaheads(正向预查 ?= ) | lookbehinds(反向预查 ?<=)
	/**
	 *  格式 ： 
	 *  正向预查:(?=)  true  | false   (?!) 
	 *  反向预查:(?<=) trur  | false   (?<!)
	 */
	$regex = '/(?<=f)d(?=f)/';    /* 前面紧跟c,d后面紧跟e*/
	$str = 'abcdefgfdf';
	if(preg_match($regex,$str,$matchs)){
		print_r($matchs);
	} 
	/**
	 * 结果
	 * Array
	 * (
	 *		[0] => d
	 * )
	 */	

	$regex = '/(?<!c)a(?!e)/';   /* a前面不紧跟c,d后面不紧跟e*/
	$str = 'abccsfadcdsefgk';

	if(preg_match($regex,$str,$matchs)){
		print_r($matchs);
	}
	/**
	 * 结果 
	 * Array( [0] => a )
	 */

	


	// 8  字符宽度 : 零
	//    验证零字符代码

	// $regex = '/HE(L)LO/i';   // (L)占一个字符
	$regex = '/HE(?=L)LO/i';    // (?=L) 不占一个字符
	$str = 'HELLO';
	if(preg_match($regex,$str,$matchs)){
		print_r($matchs);
	}
	// 结果 输出为空 (?=L)本身不占字符

	$regex = '/HE(?=L)LLO/i';
	$str = 'HELLO';
	if(preg_match($regex,$str,$matchs)){
		print_r($matchs);
	}
	// 结果 
	// Array{ [0] => 'HELLO'}

	// 说明: (?=L)意思是HE后面紧跟一个L字符。
	//       但是(?=L) 本身不占字符，要与(L)区分,(L)本身占一个字符


 




?>